#include <iostream>

#include <unistd.h>

#include "RingQueue.hpp"




using namespace RingQueueModule;

void* Producer(void * arg)
{
    RingQueue<int> *rq = static_cast<RingQueue<int> *>(arg);
    int data = 0;
    while(true)
    {
        //sleep(2);
        rq->Enqueue(data);
        printf("produced a data: %d\n", data);
        ++data;
    }
}

void* Consumer(void * arg)
{
    RingQueue<int> *rq = static_cast<RingQueue<int>*>(arg);
    int data;
    while(true)
    {
        sleep(2);
        rq->Dequeue(&data);
        printf("get a data: %d\n", data);
    }
}


int main()
{
    RingQueue<int> *rq = new RingQueue<int>(5);


    // 多生产 多消费
    pthread_t p1,c1,c2,c3,p2;
    pthread_create(&p1, nullptr, Producer, rq);
    pthread_create(&p2, nullptr, Producer, rq);
    pthread_create(&c1, nullptr, Consumer, rq);
    pthread_create(&c2, nullptr, Consumer, rq);
    pthread_create(&c3, nullptr, Consumer, rq);

    pthread_join(p1, nullptr);
    pthread_join(p2, nullptr);
    pthread_join(c1, nullptr);
    pthread_join(c2, nullptr);
    pthread_join(c3, nullptr);

    // // 单生产 单消费
    // pthread_t p,c;
    // pthread_create(&p, nullptr, Producer, rq);
    // pthread_create(&c, nullptr, Consumer, rq);

    // pthread_join(p, nullptr);
    // pthread_join(c, nullptr);

    return 0;
}